package main

import (
	"fmt"
	"html/template"
	"os"
	"path/filepath"

	"github.com/gin-gonic/gin"
	"github.com/russross/blackfriday/v2"
)

// indexHandler 首页处理器
func indexHandler(examples []Example) gin.HandlerFunc {
	return func(c *gin.Context) {
		// 解析模板文件
		tmpl, err := template.ParseFiles("templates/index.html")
		if err != nil {
			c.String(500, "模板解析错误: %v", err)
			return
		}

		c.Header("Content-Type", "text/html; charset=utf-8")
		tmpl.Execute(c.Writer, examples)
	}
}

// exampleHandler 示例页面处理器 - 展示所有内容在一个页面上
func exampleHandler(examples []Example) gin.HandlerFunc {
	return func(c *gin.Context) {
		exampleDir := c.Param("example")

		// 查找示例
		var currentExample *Example
		var prevExample *Example
		var nextExample *Example

		for i := range examples {
			if examples[i].Directory == exampleDir {
				currentExample = &examples[i]

				// 设置上一个和下一个示例
				if i > 0 {
					prevExample = &examples[i-1]
				}
				if i < len(examples)-1 {
					nextExample = &examples[i+1]
				}
				break
			}
		}

		if currentExample == nil {
			c.String(404, "示例未找到")
			return
		}

		// 获取目录中的文件内容
		contentDir := filepath.Join("content", exampleDir)

		// 读取各个文件内容
		descriptionContent := readFileContent(filepath.Join(contentDir, "description.txt"))
		exampleContent := readFileContent(filepath.Join(contentDir, "example.pas"))
		outputContent := readFileContent(filepath.Join(contentDir, "output.txt"))

		// 解析Markdown内容
		descriptionHTML := string(blackfriday.Run([]byte(descriptionContent)))

		// 获取目录中的文件信息（用于文件列表显示）
		files, err := os.ReadDir(contentDir)
		if err != nil {
			c.String(500, "读取目录失败: %v", err)
			return
		}

		var fileInfos []FileInfo
		for _, file := range files {
			if !file.IsDir() {
				info, err := file.Info()
				if err != nil {
					continue
				}
				fileInfos = append(fileInfos, FileInfo{
					Name:         file.Name(),
					Path:         filepath.Join(contentDir, file.Name()),
					Size:         info.Size(),
					Type:         getFileType(file.Name()),
					LastModified: info.ModTime().Format("2006-01-02 15:04:05"),
				})
			}
		}

		// 解析模板文件
		tmpl, err := template.ParseFiles("templates/example.html")
		if err != nil {
			c.String(500, "模板解析错误: %v", err)
			return
		}

		data := struct {
			Example            *Example
			PrevExample        *Example
			NextExample        *Example
			AllExamples        []Example
			DescriptionContent template.HTML
			ExampleContent     string
			OutputContent      string
			Files              []FileInfo
		}{
			Example:            currentExample,
			PrevExample:        prevExample,
			NextExample:        nextExample,
			AllExamples:        examples,
			DescriptionContent: template.HTML(descriptionHTML),
			ExampleContent:     exampleContent,
			OutputContent:      outputContent,
			Files:              fileInfos,
		}

		c.Header("Content-Type", "text/html; charset=utf-8")
		tmpl.Execute(c.Writer, data)
	}
}

// readFileContent 读取文件内容
func readFileContent(filename string) string {
	content, err := os.ReadFile(filename)
	if err != nil {
		return fmt.Sprintf("无法读取文件: %v", err)
	}
	return string(content)
}

// fileDisplayHandler 文件展示处理器（保持原样，用于直接查看特定文件）
func fileDisplayHandler(examples []Example) gin.HandlerFunc {
	return func(c *gin.Context) {
		exampleDir := c.Param("example")
		filename := c.Param("filename")

		// 查找示例
		var currentExample *Example
		for i := range examples {
			if examples[i].Directory == exampleDir {
				currentExample = &examples[i]
				break
			}
		}

		if currentExample == nil {
			c.String(404, "示例未找到")
			return
		}

		// 构建文件路径
		filePath := filepath.Join("content", exampleDir, filename)
		if _, err := os.Stat(filePath); os.IsNotExist(err) {
			c.String(404, "文件未找到")
			return
		}

		// 获取文件内容
		content, err := os.ReadFile(filePath)
		if err != nil {
			c.String(500, "读取文件失败: %v", err)
			return
		}

		fileType := getFileType(filename)

		// 解析模板文件
		tmpl, err := template.ParseFiles("templates/file.html")
		if err != nil {
			c.String(500, "模板解析错误: %v", err)
			return
		}

		data := struct {
			Example  *Example
			Filename string
			FileType string
			Content  string
		}{
			Example:  currentExample,
			Filename: filename,
			FileType: fileType,
			Content:  string(content),
		}

		c.Header("Content-Type", "text/html; charset=utf-8")
		tmpl.Execute(c.Writer, data)
	}
}
